// 指定当前类所属的包路径，用于组织项目结构
package com.example.springboot.service.impl;
// 导入所需的类和工具包
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.springboot.entity.Student;
import com.example.springboot.mapper.StudentMapper;
import com.example.springboot.service.StudentService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

// @Service：声明当前类是 Spring 管理的服务层组件，自动注册到 Spring 容器中
@Service
// 继承 ServiceImpl 实现服务层接口，泛型参数为 Mapper 接口和实体类
public class StudentServiceImpl extends ServiceImpl<StudentMapper, Student> implements StudentService {

    /**
     * 注入 DAO 层对象（通过 J2EE 标准的 @Resource 注解实现依赖注入）
     * @Resource 默认为按名称注入，这里注入 StudentMapper 接口的实现类
     */
    @Resource
    private StudentMapper studentMapper;

    /**
     * 学生登录
     * @param username 登录用户名
     * @param password 登录密码
     * @return 登录成功返回学生实体对象，失败返回 null
     */
    @Override// 标识重写父类方法
    public Student stuLogin(String username, String password) {
        // 创建查询条件构造器
        // 创建查询条件构造器
        QueryWrapper<Student> qw = new QueryWrapper<>();
        // 添加用户名相等的查询条件（eq：等于）
        qw.eq("username", username);
        // 添加密码相等的查询条件
        qw.eq("password", password);
        // 执行单条记录查询（根据用户名和密码查询学生信息）
        Student student = studentMapper.selectOne(qw);
        // 判断查询结果是否存在
        if (student != null) {
            // 存在则返回学生对象
            return student;
        } else {
            // 不存在则返回 null
            return null;
        }
    }

    /**
     * 新增学生
     * @param student 待新增的学生实体对象
     * @return 影响的行数（成功返回 1，失败返回 0）
     */
    @Override
    public int addNewStudent(Student student) {
        // 执行插入操作（调用 MyBatis-Plus 的基础插入方法）
        int insert = studentMapper.insert(student);
        // 返回插入结果
        return insert;
    }

    /**
     * 分页查询学生（按姓名模糊搜索）
     * @param pageNum 当前页码
     * @param pageSize 每页显示记录数
     * @param search 搜索关键词（学生姓名）
     * @return 分页结果对象（包含总记录数和当前页数据）
     */
    @Override
    public Page find(Integer pageNum, Integer pageSize, String search) {
        // 创建分页对象（传入当前页码和每页大小）
        Page page = new Page<>(pageNum, pageSize);
        // 创建查询条件构造器
        QueryWrapper<Student> qw = new QueryWrapper<>();
        // 添加姓名模糊查询条件（like：模糊匹配）
        qw.like("name", search);
        // 执行分页查询（调用 MyBatis-Plus 的分页查询方法）
        Page studentPage = studentMapper.selectPage(page, qw);
        // 返回分页结果
        return studentPage;
    }

    /**
     * 更新学生信息（根据用户名更新，假设用户名为主键）
     * @param student 包含更新后数据的学生实体对象（需包含用户名）
     * @return 影响的行数（成功返回 1，失败返回 0）
     */
    @Override
    public int updateNewStudent(Student student) {
        // 执行更新操作（调用 MyBatis-Plus 的根据 ID 更新方法，这里用户名作为主键）
        int i = studentMapper.updateById(student);
        // 返回更新结果
        return i;
    }

    /**
     * 删除学生信息（根据用户名删除，假设用户名为主键）
     * @param username 待删除学生的用户名（主键）
     * @return 影响的行数（成功返回 1，失败返回 0）
     */
    @Override
    public int deleteStudent(String username) {
        // 执行删除操作（调用 MyBatis-Plus 的根据 ID 删除方法，这里用户名作为主键）
        int i = studentMapper.deleteById(username);
        // 返回删除结果
        return i;
    }


    /**
     * 主页顶部：学生总数统计（查询所有用户名非空的记录数）
     * @return 学生总数
     */
    @Override
    public int stuNum() {
        // 创建查询条件构造器（筛选用户名非空的记录）
        QueryWrapper<Student> qw = new QueryWrapper<>();
        qw.isNotNull("username");
        // 执行统计查询（返回符合条件的记录数，转为 int 类型）
        int stuNum = Math.toIntExact(studentMapper.selectCount(qw));
        return stuNum;
    }

    /**
     * 查询学生信息方法（根据用户名获取学生详情）
     * @param username 学生用户名
     * @return 学生实体对象（存在则返回，否则返回 null）
     */
    @Override
    public Student stuInfo(String username) {
        // 创建查询条件构造器（根据用户名精确查询）
        QueryWrapper<Student> qw = new QueryWrapper<>();
        qw.eq("username", username);
        // 执行单条记录查询
        Student student = studentMapper.selectOne(qw);
        return student;
    }
}
